#include<bits/stdc++.h>
using namespace std;
namespace fastio
{
    const int bufl=1<<20;
    const double base1[16]={1,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10,1e-11,1e-12,1e-13,1e-14,1e-15};
    const double base2[16]={1,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15};
    struct IN{
        FILE *IT;char ibuf[bufl],*is=ibuf,*it=ibuf;
        IN(){IT=stdin;}IN(char *a){IT=fopen(a,"r");}
        inline char getChar(){if(is==it){it=(is=ibuf)+fread(ibuf,1,bufl,IT);if(is==it)return EOF;}return *is++;}
        template<typename Temp>inline void getInt(Temp &a){a=0;int b=0,c=getChar();while(c<48||c>57)b^=(c==45),c=getChar();while(c>=48&&c<=57)a=(a<<1)+(a<<3)+c-48,c=getChar();if(b)a=-a;}
        template<typename Temp>inline void getDouble(Temp &a){a=0;int b=0,c=getChar(),d=0;__int128 e=0,f=0;while(c<48||c>57)b^=(c==45),c=getChar();while(c>=48&&c<=57)e=(e<<1)+(e<<3)+c-48,c=getChar();if(c==46){c=getChar();while(c>=48&&c<=57)d++,f=(f<<1)+(f<<3)+c-48,c=getChar();}a=e+base1[d]*f;if(b)a=-a;}
        IN& operator>>(char &a){a=getChar();return *this;}
        IN& operator>>(char *a){do{*a=getChar();}while(*a<=32);while(*a>32)*++a=getChar();*a=0;return *this;}
        IN& operator>>(string &a){char b=getChar();while(b<=32)b=getChar();while(b>32)a+=b,b=getChar();return *this;}
        IN& operator>>(int &a){getInt(a);return *this;}
        IN& operator>>(long long &a){getInt(a);return *this;}
        IN& operator>>(__int128 &a){getInt(a);return *this;}
        IN& operator>>(float &a){getDouble(a);return *this;}
        IN& operator>>(double &a){getDouble(a);return *this;}
        IN& operator>>(long double &a){getDouble(a);return *this;}
    };
    struct OUT{
        FILE *IT;char obuf[bufl],*os=obuf,*ot=obuf+bufl;int Eps;long double Acc;
        OUT(){IT=stdout,Eps=6,Acc=1e-6;}OUT(char *a){IT=fopen(a,"w"),Eps=6,Acc=1e-6;}
        inline void ChangEps(int x=6){Eps=x;}
        inline void flush(){fwrite(obuf,1,os-obuf,IT);os=obuf;}
        inline void putChar(int a){*os++=a;if(os==ot)flush();}
        template<typename Temp>inline void putInt(Temp a){if(a<0){putChar(45);a=-a;}if(a<10){putChar(a+48);return;}putInt(a/10);putChar(a%10+48);}
        template<typename Temp>inline void putLeading(Temp a,int b){if(!b)return;putLeading(a/10,b-1);putChar(a%10+48);}
        template<typename Temp>inline void putDouble(Temp a){if(a<0){putChar(45);a=-a;}__int128 b=a;putInt(b);a-=b;a*=base2[Eps];b=a+Acc;putChar(46);putLeading(b,Eps);}
        OUT& operator<<(char a){putChar(a);return *this;}
        OUT& operator<<(char *a){while(*a>32)putChar(*a++);return *this;}
        OUT& operator<<(string a){for(auto c:a)putChar(c);return *this;}
        OUT& operator<<(int a){putInt(a);return *this;}
        OUT& operator<<(long long a){putInt(a);return *this;}
        OUT& operator<<(__int128 a){putInt(a);return *this;}
        OUT& operator<<(float a){putDouble(a);return *this;}
        OUT& operator<<(double a){putDouble(a);return *this;}
        OUT& operator<<(long double a){putDouble(a);return *this;}
        ~OUT(){flush();}
    };
}
using fastio::IN;
using fastio::OUT;
IN fin;
OUT fout;
const int NN=1e6+4;
char s[NN];
int n;
struct segment_tree
{
	struct node
	{
		int l,r,v,all;
		node operator+(const node&it)const
		{
			return {l,it.r,min(it.v,v+it.all),all+it.all};
		}
	}tr1[NN<<2];
	void build(int u,int l,int r)
	{
		tr1[u]={l,r,0,0};
		if(l==r)
		{
			if(s[l]=='1')
				tr1[u].v=tr1[u].all=1;
			else
				tr1[u].v=tr1[u].all=-1;
			return;
		}
		int mid=l+(r-l)/2;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		tr1[u]=tr1[u<<1]+tr1[u<<1|1];
	}
	node change(node a,node b)
	{
		if(!a.l)
			return b;
		return a+b;
	}
	void modify(int u,int p,int v)
	{
		if(!p)
			return;
		if(tr1[u].l==tr1[u].r)
		{
			tr1[u].v+=v,tr1[u].all+=v;
			return;
		}
		int mid=tr1[u].l+(tr1[u].r-tr1[u].l)/2;
		if(p<=mid)
			modify(u<<1,p,v);
		else
			modify(u<<1|1,p,v);
		tr1[u]=tr1[u<<1]+tr1[u<<1|1];
	}
	node query(int u,int l,int r)
	{
		if(tr1[u].l>=l&&tr1[u].r<=r)
			return tr1[u];
		int mid=tr1[u].l+(tr1[u].r-tr1[u].l)/2;
		node res={0,0,0,0};
		if(l<=mid)
			res=change(res,query(u<<1,l,r));
		if(r>mid)
			res=change(res,query(u<<1|1,l,r));
		return res;
	}
}A;
struct bit_array
{
	int tr2[NN];
	int lowbit(int x)
	{
		return x&-x;
	}
	void add(int u,int v)
	{
		while(u<=n+1)
		{
			tr2[u]+=v;
			u+=lowbit(u);
		}
	}
	int ask(int u)
	{
		int res=0;
		while(u)
		{
			res+=tr2[u];
			u-=lowbit(u);
		}
		return res;
	}
}B;
vector<int>p[NN];
int main()
{
	freopen("good.in","r",stdin);
	freopen("good.out","w",stdout);
	int q;
	fin>>n>>q>>(s+1);
	n=strlen(s+1);
	A.build(1,1,n);
	for(int i=1;i<=q;i++)
	{
		int l,r;
		fin>>l>>r;
		p[l].push_back(r);
	}
	stack<int>stk;
	int ans=0;
	for(int i=n;i;i--)
	{
		if(s[i]=='0')
		{
			stk.push(i);
			A.modify(1,i-1,1);
			B.add(i,1);
		}
		else if(stk.size())
		{
			A.modify(1,stk.top()-1,-1);
			B.add(stk.top(),-1);
			stk.pop();
		}
		for(int j=0;j<(int)p[i].size();j++)
			ans^=max(0,-A.query(1,i,p[i][j]).v)+B.ask(p[i][j]+1);
	}
	fout<<ans;
	return 0;
}
